package com.itheima.logger;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect
@Order(2)
public class Logger {
    /**
     * 定义一个切点，用于匹配特定的方法执行。
     * 这里的切点表达式指定的是com.itheima.service.impl.DeptServiceImpl类中的findAll方法的执行。
     * 该方法返回一个java.util.List类型的结果，是业务逻辑中查询所有部门信息的典型操作。
     * 通过这种方式，我们可以对这个特定的方法执行进行监控或者织入额外的逻辑，比如日志记录、性能统计等。
     */
    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(*))")
    public void pt() {
    }

    /**
     * 基于切面的环绕通知，用于方法执行前后的日志记录和异常处理。
     * 此注释解释了方法的作用、参数和返回值。
     *
     * @param pjp ProceedingJoinPoint，用于执行目标方法的对象，包含目标方法的信息和参数。
     * @return 返回目标方法的执行结果。
     */
//    @Around("pt()")
//    public Object m5(ProceedingJoinPoint pjp){
//        Object object = null;
//        // 尝试执行目标方法，并捕获可能的异常。
//        try {
//            System.out.println("即将进入方法");
//            object = pjp.proceed(); // 执行目标方法。
//            System.out.println("方法正常结束");
//        } catch (Exception e) {
//            // 处理目标方法执行过程中抛出的异常。
//            e.printStackTrace();
//            System.out.println("方法出现异常");
//        } finally {
//            // 无论方法执行成功还是失败，都会执行此块代码。
//            System.out.println("方法运行到最后");
//            return object; // 返回目标方法的执行结果。
//        }
//    }
    @Around("pt()")
    public Object m6(ProceedingJoinPoint pjp) throws Throwable {
        Object object = null;
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("类名：" + pjp.getTarget().getClass().getName());
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        stringBuffer.append("，方法名：" + signature.getMethod().getName());
        stringBuffer.append("，参数：" + Arrays.toString(pjp.getArgs()));
        try {
            object = pjp.proceed(); // 执行目标方法。
            stringBuffer.append("，返回值：" + object);
        } catch (Exception e) {
            // 处理目标方法执行过程中抛出的异常。
            e.printStackTrace();
            stringBuffer.append("，异常值：" + e.getMessage());
        } finally {
            // 无论方法执行成功还是失败，都会执行此块代码
            long l1 = System.currentTimeMillis();
            System.out.println("结果：" + stringBuffer.toString());
        }
        return object; // 返回目标方法的执行结果。
    }
//    /**
//     * 方法执行前的前置通知。
//     * 在目标方法执行之前打印一条信息，表示方法即将开始执行。
//     */
//    @Before("pt()")
//    public void m1() {
//        System.out.println("即将进入方法");
//    }
//
//    /**
//     * 方法执行后的后置通知。
//     * 在目标方法执行之后，无论方法执行是否成功，都会打印一条信息。
//     */
//    @After("pt()")
//    public void m2() {
//        System.out.println("后置通知");
//    }
//
//    /**
//     * 方法正常返回后的返回通知。
//     * 在目标方法返回结果之后，打印一条信息，表示方法执行成功并返回了结果。
//     */
//    @AfterReturning("pt()")
//    public void m3() {
//        System.out.println("返回后通知");
//    }
//
//    /**
//     * 方法执行抛出异常时的异常通知。
//     * 当目标方法执行抛出异常时，打印一条信息，表示方法执行遇到了异常。
//     */
//    @AfterThrowing("pt()")
//    public void m4() {
//        System.out.println("异常后通知");
//    }

}
